// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CC_TEST_TEST_CONTEXT_SUPPORT_H_
#define CC_TEST_TEST_CONTEXT_SUPPORT_H_

#include <stdint.h>

#include <set>
#include <vector>

#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "gpu/command_buffer/client/context_support.h"

namespace gfx {
class Rect;
class RectF;
}

namespace cc {

class TestContextSupport : public gpu::ContextSupport {
public:
    TestContextSupport();
    ~TestContextSupport() override;

    // gpu::ContextSupport implementation.
    void SignalSyncToken(const gpu::SyncToken& sync_token,
        const base::Closure& callback) override;
    bool IsSyncTokenSignalled(const gpu::SyncToken& sync_token) override;
    void SignalQuery(uint32_t query, const base::Closure& callback) override;
    void SetAggressivelyFreeResources(bool aggressively_free_resources) override;
    void Swap() override;
    void SwapWithDamage(const gfx::Rect& damage) override;
    void PartialSwapBuffers(const gfx::Rect& sub_buffer) override;
    void CommitOverlayPlanes() override;
    void ScheduleOverlayPlane(int plane_z_order,
        gfx::OverlayTransform plane_transform,
        unsigned overlay_texture_id,
        const gfx::Rect& display_bounds,
        const gfx::RectF& uv_rect) override;
    uint64_t ShareGroupTracingGUID() const override;
    void SetErrorMessageCallback(
        const base::Callback<void(const char*, int32_t)>& callback) override;

    void CallAllSyncPointCallbacks();

    typedef base::Callback<void(int plane_z_order,
        gfx::OverlayTransform plane_transform,
        unsigned overlay_texture_id,
        const gfx::Rect& display_bounds,
        const gfx::RectF& crop_rect)>
        ScheduleOverlayPlaneCallback;
    void SetScheduleOverlayPlaneCallback(
        const ScheduleOverlayPlaneCallback& schedule_overlay_plane_callback);

    // If set true, callbacks triggering will be in a reverse order as SignalQuery
    // calls.
    void set_out_of_order_callbacks(bool out_of_order_callbacks)
    {
        out_of_order_callbacks_ = out_of_order_callbacks;
    }

private:
    std::vector<base::Closure> sync_point_callbacks_;
    ScheduleOverlayPlaneCallback schedule_overlay_plane_callback_;
    bool out_of_order_callbacks_;

    base::WeakPtrFactory<TestContextSupport> weak_ptr_factory_;

    DISALLOW_COPY_AND_ASSIGN(TestContextSupport);
};

} // namespace cc

#endif // CC_TEST_TEST_CONTEXT_SUPPORT_H_
